// #include<bits/stdc++.h>
// #define sd(n) scanf("%d",&n) 
// #define sld(n) scanf("%lld",&n)
// #define pd(n) printf("%d", (n))
// #define pld(n) printf("%lld", n)
// #define all(x) (x).begin(),(x).end()
// #define rall(x) (x).rbegin(),(x).rend()
// #define fi first
// #define se second
// const int N = 2e5;
// #define INF 0x7fffffff
// typedef long long int ll;
// using namespace std;
// //----------------------------------------------------------------------------//
// struct node
// {
// 	ll eg=0;
// 	int f;
// };

// bool cmp(node a, node b)
// {
// 	return a.f <= b.f;
// }
// node a[N + 10];
// ll b[N + 10];
// int n;
// int main()
// {
// 	sd(n);
// 	a[1].f =0;

// 	for (int i = 2; i <=n; i++) cin >> a[i].f;
	

// 	for (int i = 1; i <= n; i++) sld(b[i]);
	
// 	sort(b + 1, b + 1 + n);

// 	sort(a + 1, a + 1 + n, cmp);

	
// 	for (int i = n,j=1; i >= 2; i--,j++)
// 	{
// 		a[i].eg += b[j];
// 		ll t= a[i].eg;
// 		a[a[i].f].eg += t;
// 	}
	
// 	cout << a[1].eg << '\n';

// 	return 0;
// }



// #include<bits/stdc++.h>
// #define sd(n) scanf("%d",&n) 
// #define sld(n) scanf("%lld",&n)
// #define pd(n) printf("%d", (n))
// #define pld(n) printf("%lld", n)
// #define all(x) (x).begin(),(x).end()
// #define rall(x) (x).rbegin(),(x).rend()
// #define fi first
// #define se second
// const int N=2e5+10;
// #define INF 0x7fffffff
// typedef long long int ll;
// using namespace std;
// //----------------------------------------------------------------------------//

// int f[N];
// ll a[N],ans;
// int main()
// {
//     int n;
//     sd(n);
//     for(int i=1;i<n;i++) sd(f[i]);
//     for(int i=0;i<n;i++) sd(a[i]);
//     sort(f,f+n);
//     sort(a,a+n);
//     for(int i=n-1;i>0;i--) a[f[i]]+=a[i];
//     for(int i=0;i<n;i++) ans+=a[i];
//     pld(ans);
//     return 0;
// }




#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N=2e5+10;
#define INF 0x7fffffff
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//

int f[N],n;//f[N]只为了存父节点,这个数组用一遍就会被废弃掉

ll eg[N];

ll st[N],sum;

int main()
{
	// int T;
	// sd(T);
	// while (T--)
	// {
	// 	solve();
	// }

	sd(n);
	//int deep=0;

	for(int i=2;i<=n;i++) sd(f[i]);//父亲节点

	for(int i=1;i<=n;i++) sld(eg[i]);//边权值

	st[1]=1;//这里的1代表这棵树的根(只走了一次)
	
	for(int i=2;i<=n;i++) st[i]=st[f[i]]+1;//类似于dp去更新每个节点的经过次数
	
	sort(eg+1,eg+1+n,[](int a,int b){//排降序
		return a>b;
	});
	
	sort(st+1,st+n+1,[](int a,int b)//排降序
	{
		return a>b;
	});
	for(int i=1;i<=n;i++) sum+=(ll)(st[i]*eg[i]);//经过次数*他的边权值
	

	pld(sum);
	puts("");

	return 0;
}